﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using JasRibbonApplicatie.Classes;
using System.Threading;
using JasRibbonApplicatie.Controllers;
using System.Media;

namespace JasRibbonApplicatie.Views
{
	public partial class Ontleningen : Page
	{
		public const String STARTEN_TEXT = "Scannen starten";
		public const String STOPPEN_TEXT = "Scannen stoppen";
        public const int STATUS_ONTLENING = 1;
        public const int STATUS_TERUGBRENGEN = 2;

		private List<Aanvraag> lijstAanvragen;
		private Aanvraag huidigeAanvraag;
		private int weekverschuiving;
		private Magazijnier huidigeMagazijnier;
		private OntleningBeheerder ontleningBeheerder;
        private int status;
        private MainWindow mainPageRef;
        //private Stack<String> undoStack;

        private SoundPlayer succesNotificationPlayer;
        private SoundPlayer failedNotificationPlayer;

		public Ontleningen()
		{
			using (OverrideCursor cursor = new OverrideCursor(Cursors.Wait))
			{
				InitializeComponent();
                // property Build Action van sound-files moet Resource zijn
                var uriSucces = new Uri("/Resources/Mail.wav", UriKind.RelativeOrAbsolute);
                var streamSucces = Application.GetResourceStream(uriSucces).Stream;
                succesNotificationPlayer = new SoundPlayer(streamSucces);
                var uriFailed = new Uri("/Resources/KDE_Notify.wav", UriKind.RelativeOrAbsolute);
                var streamFailed = Application.GetResourceStream(uriFailed).Stream;
                failedNotificationPlayer = new SoundPlayer(streamFailed);

				try
				{
					huidigeMagazijnier = Queries.GetMagazijnierByGebruiker_id(Login.Instance.User.gebruiker_id);
				}
				catch (ArgumentException ex)
				{
					huidigeMagazijnier = null;
					// startenUitscannenButton wordt dan niet geactiveerd
				}

                mainPageRef = Login.Instance.MainWindowReference;
                if (mainPageRef.btnTerugbrengen.Background != mainPageRef.GetButtonBrush())
                {
                    status = STATUS_ONTLENING; // standaardstatus gereed maken
                    mainPageRef.btnOntlenen.Background = mainPageRef.GetButtonBrush();
                    mainPageRef.btnOntlenen.BorderBrush = Brushes.Crimson;	
                }
                else
                {
                    status = STATUS_TERUGBRENGEN;
                }
                			

				lijstAanvragen = new List<Aanvraag>();

				weekverschuiving = 0;
				updateAanvragenLijst(false);

				// beheerknop instellen
                mainPageRef.btnOntleningBeheer.Label = STARTEN_TEXT;
                mainPageRef.btnOntleningBeheer.IsEnabled = false;
                mainPageRef.btnOngendaanMaken.IsEnabled = false;
                disableScanActies();
				huidigeAanvraag = null;
				ontleningBeheerder = null;
                //undoStack = new Stack<string>();
                probleemGroupbox.Visibility = Visibility.Hidden;
			}
		}

        public void ChangeStatus(int status)
        {
            if (status == STATUS_ONTLENING || status == STATUS_TERUGBRENGEN)
            {
                this.status = status;
                updateAanvragenLijst(false);
            }
            else
            {
                throw new ArgumentException("Geen gekende status voor Ontleningen...");
            }
        }

		private void vorigeWeekButton_Click(object sender, RoutedEventArgs e)
		{
			weekverschuiving--;
			updateAanvragenLijst(false);
		}

		private void volgendeWeekButton_Click(object sender, RoutedEventArgs e)
		{
			weekverschuiving++;
			updateAanvragenLijst(false);
		}

		private void huidigeWeekButton_Click(object sender, RoutedEventArgs e)
		{
			weekverschuiving = 0;
			updateAanvragenLijst(false);
		}
        public void AanvragenVandaagButtonClick()
        {
            this.updateAanvragenLijst(true);
        }

		private void updateAanvragenLijst(bool enkelAanvragenVandaag) // eventueel later voor mogelijkheid zorgen dat
            // enkel de aanvragen getoond worden voor vandaag die de aangemelde magazijnier moet afhandelen
		{
			using (OverrideCursor cursor = new OverrideCursor(Cursors.Wait))
			{
				// eventueel een weekverschuiving toepassen
                if (status == STATUS_ONTLENING)
                {
                    if (enkelAanvragenVandaag)
                    {
                        lijstAanvragen = Queries.GetAanvragenByOphaalDate(DateTime.Today);
                    }
                    else
                    {
                        lijstAanvragen = Queries.GetAanvragenPerWeekByOphaaldatum(DateTime.Today.AddDays((Queries.AANTAL_DAGEN_IN_WEEK) * weekverschuiving));
                    }
                }
                else
                {
                    if (enkelAanvragenVandaag)
                    {
                        lijstAanvragen = Queries.GetAanvragenByInleverDate(DateTime.Today);
                    }
                    else
                    {
                        lijstAanvragen = Queries.GetAanvragenPerWeekByTerugbrengdatum(DateTime.Today.AddDays((Queries.AANTAL_DAGEN_IN_WEEK) * weekverschuiving));
                    }
                }
				aanvragenDataGrid.ItemsSource = lijstAanvragen;

				// weekLabel nog instellen
                StringBuilder resultaatWeekLabel = new StringBuilder();
                if (enkelAanvragenVandaag)
                {
                    resultaatWeekLabel.Append("Vandaag");
                    huidigeWeekButton.IsEnabled = true;
                }
                else
                {
                    if (weekverschuiving == 0)
                    {
                        resultaatWeekLabel.Append("Huidige week");
                        huidigeWeekButton.IsEnabled = false;
                    }
                    else
                    {
                        resultaatWeekLabel.Append(String.Format("{0} ", Math.Abs(weekverschuiving)));

                        String weekWoord = null;
                        if (Math.Abs(weekverschuiving) < 2)
                            weekWoord = "week";
                        else
                            weekWoord = "weken";
                        resultaatWeekLabel.Append(String.Format("{0} ", weekWoord));

                        String verschuiving = null;
                        if (weekverschuiving < 0)
                            verschuiving = "terug";
                        else
                            verschuiving = "vooruit";
                        resultaatWeekLabel.Append(String.Format("{0} ", verschuiving));

                        huidigeWeekButton.IsEnabled = true;
                    }
                }
				weekLabel.Content = resultaatWeekLabel.ToString();
			}
		}

		public void ontleningBeherenButton_Click()
		{
            if (mainPageRef.btnOntleningBeheer.Label.Equals(STARTEN_TEXT))
			{
				using (OverrideCursor cursor = new OverrideCursor(Cursors.Wait))
				{
                    mainPageRef.btnOntleningBeheer.Label = STOPPEN_TEXT;
                    enableScanActies(); // worden alle overig controls gedisabled!!!
					aanvragenCanvas.IsEnabled = false;
					uitscannenMaterialenCanvas.IsEnabled = true;
					uitlegScannenLabel.IsEnabled = true;
					ontleningBeheerder = new OntleningBeheerder(huidigeAanvraag, huidigeMagazijnier);
					materialenDataGrid.ItemsSource = ontleningBeheerder.OntleningDataMaterialen;
					toebehorenDataGrid.ItemsSource = ontleningBeheerder.OntleningDataToebehoren;
					//materialenDataGrid.DataContext = ontleningBeheerder.OntleningDataMaterialen;
					scanTextBox.IsEnabled = true;
                    laatstGescandTextBox.Text = "";
                    statusImage.Source = new ImageSourceConverter().ConvertFromString("pack://application:,,,/JasRibbonApplicatie;component/Images/info.png") as ImageSource;

				}
				scanTextBox.Focus();
			}
            else if (mainPageRef.btnOntleningBeheer.Label.Equals(STOPPEN_TEXT))
			{
				Queries.OpslaanWijzigingen();
				// nog controleren of alle producten uit de aanvraag ingescand zijn
                // => binnenkort nog een extra MessageBox, maar ontlening-acties worden nu dan gewoon naar
                //    database geschreven als de gebruiker op STOPPEN klikt...
				// factuur afdrukken vóórdat afsluiten toegelaten wordt.
                // => wordt binnenkort geïmplementeerd....
				aanvragenCanvas.IsEnabled = true;
                mainPageRef.btnOntleningBeheer.Label = STARTEN_TEXT;
                disableScanActies();
				uitscannenMaterialenCanvas.IsEnabled = false;
				uitlegScannenLabel.IsEnabled = false;
				scanTextBox.Text = "";
				scanTextBox.IsEnabled = false;
				huidigeAanvraag = null;
                mainPageRef.btnOntleningBeheer.IsEnabled = false;
                mainPageRef.btnOngendaanMaken.IsEnabled = false;
                //undoStack.Clear();
			}
		}

		private void scanTextBox_TextChanged(object sender, TextChangedEventArgs e)
		{
			TextBox textbox = (TextBox)sender;
			String inhoud = textbox.Text.ToLower();

			if (inhoud.Length == Queries.LENGTH_SCANCODES)
			{
				// invoer niet meer toelaten (proces kan tijdje duren)
				// gebruiker kan en mag terwijl niets doen...

				//is threading/tasks geen bruikbare oplossing? (Johan)
				// => ik laat een wachtcursor tonen; volgens mij kan de gebruiker terwijl toch niets doen (of denk je dat
				//    dat dan allemaal op de achtergrond kan verlopen; wat dan als de gebruiker 10 dingen snel achter elkaar
				//    inscant; wordt het dan instabiel of niet? (threading)

				textbox.IsEnabled = false;
				laatstGescandTextBox.Text = inhoud;				
				try
				{
					bool toegevoegd = false;
					using (OverrideCursor cursor = new OverrideCursor(Cursors.Wait)) // wachtcursor tonen
					{
                        if (status == STATUS_ONTLENING)
                        {
                            toegevoegd = ontleningBeheerder.OntleningToevoegen(inhoud);
                        }
                        else if (status == STATUS_TERUGBRENGEN)
                        {
                            toegevoegd = ontleningBeheerder.OntleningBeeindigen(inhoud);
                        }
					}
					if (toegevoegd)
					{
                        succesNotificationPlayer.Play();
                        probleemGroupbox.Visibility = Visibility.Hidden;
						statusImage.Source = new ImageSourceConverter().ConvertFromString("pack://application:,,,/JasRibbonApplicatie;component/Images/vinkjeGroen.png") as ImageSource;
                        //undoStack.Push(inhoud);
                        mainPageRef.btnOngendaanMaken.IsEnabled = true;
						materialenDataGrid.Items.Refresh();
						toebehorenDataGrid.Items.Refresh();
					}
					else
					{
                        // geluid gespeeld in notifyProblem
						statusImage.Source = new ImageSourceConverter().ConvertFromString("pack://application:,,,/JasRibbonApplicatie;component/Images/gevarendriehoek1.png") as ImageSource;
						notifyProblem("Dit product kan niet uitgeleend worden voor deze aanvraag!",
                            (new ImageSourceConverter().ConvertFromString("pack://application:,,,/JasRibbonApplicatie;component/Images/verbodsbord2.png") as ImageSource));
					}
				}
				catch (ArgumentException aex)
				{
                    // geluid gespeeld in notifyProblem
					statusImage.Source = new ImageSourceConverter().ConvertFromString("pack://application:,,,/JasRibbonApplicatie;component/Images/gevarendriehoek1.png") as ImageSource;
                    notifyProblem("Probleem: " + aex.Message,
                        (new ImageSourceConverter().ConvertFromString("pack://application:,,,/JasRibbonApplicatie;component/Images/close.png") as ImageSource));

				}

				textbox.Text = "";
				textbox.IsEnabled = true;
				textbox.Focus(); // zodat je terug iets kunt inscannen
			}
		}

        private void notifyProblem(String probleem, ImageSource afbeeldingsbron)
        {
            probleemGroupbox.Visibility = Visibility.Visible;
            probleemImage.Source = afbeeldingsbron;
            probleemTextBox.Text = probleem;
            failedNotificationPlayer.Play();
        }

		private void aanvragenDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
		{
			DataGrid dg = sender as DataGrid;
			Aanvraag tempAanvraag = dg.SelectedItem as Aanvraag;

			// aangemelde persoon moet een magazijnier zijn, anders kan deze niet beginnen met uitscannen
            if ((huidigeMagazijnier != null && aanvragenDataGrid.IsEnabled == true) || mainPageRef.btnOntleningBeheer.Label.Equals(STOPPEN_TEXT)) // anders geen rij geselecteerd
			{
				if (tempAanvraag != null && ((tempAanvraag.Status.Equals(Aanvraag.Statussen.goedgekeurd)
                    || tempAanvraag.Status.Equals(Aanvraag.Statussen.behandeld)
                    || tempAanvraag.Status.Equals(Aanvraag.Statussen.verstreken))))
				{
					huidigeAanvraag = tempAanvraag;
                    mainPageRef.btnOntleningBeheer.IsEnabled = true;
                    // misschien effectje (zéér licht) om deze knop te laten opvallen....
				}				
			}
			else
			{
				mainPageRef.btnOntleningBeheer.IsEnabled = false;
			}
		}


        private void disableScanActies()
        {
            //mainPageRef.btnOngendaanMaken.IsEnabled = false;
            mainPageRef.btnOngendaanMaken.IsEnabled = false;
            mainPageRef.materiaalTab.IsEnabled = true;
            mainPageRef.aanvragenTab.IsEnabled = true;
            mainPageRef.gebruikersTab.IsEnabled = true;
            mainPageRef.ScannenGroup.IsEnabled = true;
            mainPageRef.planningTab.IsEnabled = true;
            mainPageRef.Logoff.IsEnabled = true;
            mainPageRef.Close.IsEnabled = true;
        }

        private void enableScanActies()
        {
            mainPageRef.btnOngendaanMaken.IsEnabled = true;
            mainPageRef.materiaalTab.IsEnabled = false;
            mainPageRef.aanvragenTab.IsEnabled = false;
            mainPageRef.gebruikersTab.IsEnabled = false;
            mainPageRef.ScannenGroup.IsEnabled = false;
            mainPageRef.planningTab.IsEnabled = false;
            mainPageRef.Logoff.IsEnabled = false;
            mainPageRef.Close.IsEnabled = false;
        }
		

        public void undo()
        {
            //if (undoStack.Count > 0)
            //{
            //    Queries.OpslaanWijzigingen();
            //    if (status == STATUS_ONTLENING)
            //    {
            //        // remove laatste ontlening!!!
            //    }
            //    else if (status == STATUS_TERUGBRENGEN)
            //    {
            //        // laatste ontlening: terugbreng datum en magazijnier terug op beginwaarden instellen
            //    }
            //}
            //if (undoStack.Count <= )
            //{
                
            //}
            Queries.OpslaanWijzigingen();
            String laatsteScanString = laatstGescandTextBox.Text;
            if (status == STATUS_ONTLENING)
            {
                ontleningBeheerder.RemoveOntlening(laatsteScanString);
            }
            else if (status == STATUS_TERUGBRENGEN)
            {
                ontleningBeheerder.UndoBeeindigingOntlening(laatsteScanString);
            }
            laatstGescandTextBox.Text = null;
            statusImage.Source = new ImageSourceConverter().ConvertFromString("pack://application:,,,/JasRibbonApplicatie;component/Images/info.png") as ImageSource;
            Queries.OpslaanWijzigingen();
            mainPageRef.btnOngendaanMaken.IsEnabled = false;
            materialenDataGrid.Items.Refresh();
            toebehorenDataGrid.Items.Refresh();
        }
	}
}
